#coding=UTF-8
from datetime import datetime
from flask import render_template, flash, redirect,url_for,request,current_app, g,jsonify
from flask_login import current_user,login_required
from flask_babel import get_locale
from app import  db
from app.main.forms import  EditProfileForm, PostForm,MessageForm
from app.models import User, Post, Message, Notification
from app.main import bp
from app.main.forms import SearchForm

@bp.before_app_request
# 每一次请求到来后，都会先进入函数before_request()中
def before_request():
	if current_user.is_authenticated:
		current_user.last_seen = datetime.utcnow()
		db.session.commit()
		g.search_form = SearchForm()
	g.locale = str(get_locale())

@bp.route('/', methods = ['GET', 'POST'])
@bp.route('/index',methods = ['GET','POST'])
@login_required
#告诉程序，使用这个方法是要求用户登录的
def index():
	form = PostForm()
	if form.validate_on_submit():
		post = Post(body = form.post.data,author = current_user)
		db.session.add(post)
		db.session.commit()
		flash('Your post is now live!')
		return redirect(url_for('main.index'))
	page = request.args.get('page',1,type =int)
	posts = current_user.followed_posts().paginate(page,current_app.config['POSTS_PER_PAGE'],False)
	next_url = url_for('main.index', page = posts.next_num) if posts.has_next else None
	prev_url = url_for('main.index', page = posts.prev_num) if posts.has_prev else None
	return render_template('index.html', title='Home Page', form=form,posts=posts.items, next_url = next_url, prev_url = prev_url)

# explore 视图函数
@bp.route('/explore')
@login_required
def explore():
	page = request.args.get('page',1,type = int)
	posts = Post.query.order_by(Post.timestamp.desc()).paginate(page,current_app.config['POSTS_PER_PAGE'],False)
	next_url = url_for('main.explore', page = posts.next_num) if posts.has_next else None
	prev_url = url_for('main.explore', page = posts.prev_num) if posts.has_prev else None
	return render_template('index.html',title = 'Explore', posts = posts.items, next_url = next_url, prev_url = prev_url)

@bp.route('/user/<username>')
@login_required
def user(username):
	user = User.query.filter_by(username = username).first_or_404()
	page = request.args.get('page',1,type = int)
	posts = user.posts.order_by(Post.timestamp.desc()).paginate(page,current_app.config['POSTS_PER_PAGE'],False)
	next_url = url_for('main.user', username = user.username, page = posts.next_num) if posts.has_next else None
	prev_url = url_for('main.user', username = user.username, page = posts.prev_num) if posts.has_prev else None
	return render_template('user.html', user = user, posts = posts.items, next_url = next_url, prev_url = prev_url)

@bp.route('/edit_profile', methods = ['GET','POST'])
@login_required
def edit_profile():
	form = EditProfileForm(current_user.username)
	if form.validate_on_submit():
		current_user.username = form.username.data
		current_user.about_me = form.about_me.data
		db.session.commit()
		flash('Your change have been saved.')
		return redirect(url_for('main.edit_profile'))
	elif request.method == 'GET':
		form.username.data = current_user.username
		form.about_me.data = current_user.about_me
	return render_template('edit_profile.html',title = 'Edit Profile',form = form)

# 关注函数
@bp.route('/follow/<username>')
@login_required
def follow(username):
	user = User.query.filter_by(username = username).first()
	# 如果用户不存在，跳转到初始页面
	if user is None:
		flash('User {} not found.'.format(username))
		return redirect(url_for('main.index'))
	#判断是不是自己关注自己
	if user == current_user:
		flash('You cannot follow yourself!')
		return redirect(url_for('main.user',username = username))
	current_user.follow(user)
	db.session.commit()
	flash('You are following {}!'.format(username))
	return redirect(url_for('main.user',username = username))

# 取消关注
@bp.route('/unfollow/<username>')
@login_required
def unfollow(username):
	user = User.query.filter_by(username = username).first()
	if user is None:
		flash('User {} is not found.'.format(username))
		return redirect(url_for('main.index'))
	if user == current_user:
		flash('You cannot unfollow yourself!')
		return redirect(url_for('main.user',usernmae = username))
	current_user.unfollow(user)
	db.session.commit()
	flash('You are not following {} .'.format(username))
	return redirect(url_for('main.user', username = username))

# 弹窗路由
@bp.route('/user/<username>/popup')
@login_required
def user_popup(username):
	user = User.query.filter_by(username = username).first_or_404()
	return render_template('user_popup.html',user = user)

# 定义搜索视图
@bp.route('/search')
@login_required
def search():
	if not g.search_form.validate():
		return redirect(url_for('main.explore'))
	page = request.args.get('page',1, type = int)
	posts, total = Post.search(g.search_form.q.data, page,current_app.config['POSTS_PER_PAGE'])
	next_url = url_for('main.search', q = g.search_form.q.data,page = page+1) \
			   if total > page * current_app.config['POSTS_PER_PAGE'] else None
	prev_url = url_for('main.search', q = g.search_form.q.data, page = page - 1)\
			   if page > 1 else None
	return render_template('search.html', title = 'Search', posts =posts, next_url = next_url, prev_url = prev_url)

# 发送消息的视图
# 存储发送的消息
@bp.route('/send_message/<recipient>',methods = ['GET','POST'])
@login_required
def send_message(recipient):
	
	user = User.query.filter_by(username = recipient).first_or_404()
	form = MessageForm()
	if form.validate_on_submit():
		msg = Message(author=current_user, recipient = user, body=form.message.data)
		db.session.add(msg)
		db.session.commit()
		flash('Your Message has been sent.')
		return redirect(url_for('main.user', username = recipient))
	return render_template('send_message.html', title='Send Message', form=form, recipient=recipient)

"""
消息视图:
显示消息，按照时间的顺序
"""
@bp.route('/messages')
@login_required
def messages():
	current_user.last_message_read_time = datetime.utcnow()
	current_user.add_notification('unread_message_count', 0)
	db.session.commit()
	page = request.args.get('page', 1 ,type = int)
	messages = current_user.messages_received.order_by(
				Message.timestamp.desc()).paginate(page, current_app.config['POSTS_PER_PAGE'],False)

	next_url = url_for('main.messages',page = messages.next_num) if messages.has_next else None

	prev_url = url_for('main.messages', page = message.prev_num) if messages.has_prev else None
	return render_template('messages.html',messages = messages.items, next_url = next_url, prev_url = prev_url)


# Notification 路由视图
# return: notification JSON format
@bp.route('/notifications')
@login_required
def notifications():
	since = request.args.get('since', 0.0, type = float)
	notifications = current_user.notifications.filter(Notification.timestamp > since).order_by(Notification.timestamp.asc())
	return jsonify([{
		'name':n.name ,
		'data':n.get_data(),
		'timestamp':n.timestamp
		} for n in notifications])

